package com.zy;

import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import static java.time.Duration.ofSeconds;

/**
 * @program: AI_langchain4j
 * @description: 少样本提示: 它是一种通过给大语言模型提供 少量示例（示例输入输出对），来指导模型生成符合预期输出的技术。
 * @author: zy
 * @create: 2025-06-28 16:35
 */
public class _09_FewShot {
    public static void main(String[] args) {

        String apiKey = System.getenv("OPEN_AI_KEY");

        OpenAiStreamingChatModel model = OpenAiStreamingChatModel.builder()
                .apiKey(apiKey)
                .modelName("deepseek-chat")
                .baseUrl(   "https://api.deepseek.com"    )    //deepseek的API地址
                .logRequests(true)
                //.logResponses(true)
                .timeout(ofSeconds(60))
                .build();

        //场景假设: 你是一个App软件客户服务代表，你需要帮助处理用户的反馈。
        // 这里主要针对的是此App升级更新后的反馈.

        //// 初始化 Few-Shot 示例历史，用于给大模型提供上下文指导
        List<ChatMessage> fewShotHistory = new ArrayList<>();
        //  添加正面反馈示例
        fewShotHistory.add(UserMessage.from(
                "我喜欢App的这次更新，用户界面非常友好，新特性功能十分惊人."));
        fewShotHistory.add(AiMessage.from(
                "动作: 提交一个正向反馈并存储. \n回复: 非常感谢您的反馈!我们已将你的消息转给我们的产品团队，他们将很高兴. 我们希望您继续愉快地使用我们的产品."));

        //添加负面反馈示例
        fewShotHistory.add(UserMessage
                .from("在我的机器上更新以后经常死机. "));
        fewShotHistory.add(AiMessage.from(
                "动作: 新开工单-更新机器后崩溃\n回复: 很抱歉听到您的反馈。我们已经将问题报告提交给我们的产品团队并将快速定位问题点. 当问题解决以后我们将向您发送邮件。我们将随时提供您需要的更进一步的帮助."));

        // 另一个正面反馈
        fewShotHistory.add(UserMessage
                .from("你的app使我的日常工作如此简单!向你的团队致敬."));
        fewShotHistory.add(AiMessage.from(
                "动作:提交一个正向反馈并存储. \n回复: 非常感谢您的反馈!听到我们的app使您的日常工作更简单我们很激动!我们将此消息与我们的团队分享。我们希望您继续使用我们的App!"));

        // 另一个负面反馈
        fewShotHistory.add(UserMessage
                .from("新特性工作不如预期. 它引起了数据丢失."));
        fewShotHistory.add(AiMessage.from(
                "动作: 新开工单-更新后数据丢失\n回复:我们对导致的损失我们很遗憾。 您的反馈对我们非常重要.我们已将问题汇报给技术团队.他们将优先处理这些问题. 我们向您通报更新的进度，问题一旦解决我们将第一时间通知您.  感谢您的包容和支持. "));

        // ****添加一个正式的用户问题
        UserMessage customerComplaint = UserMessage
                .from("我的app运行如此慢，请告知如何处理!");
        fewShotHistory.add(customerComplaint);

        System.out.println("[用户消息]: " + customerComplaint.singleText());
        System.out.print("[大模型响应]: ");

        CompletableFuture<ChatResponse> futureChatResponse = new CompletableFuture<>();

        //流式响应输出
        model.chat(fewShotHistory, new StreamingChatResponseHandler() {

            @Override
            public void onPartialResponse(String partialResponse) {
                System.out.print(partialResponse);
            }

            @Override
            public void onCompleteResponse(ChatResponse completeResponse) {
                futureChatResponse.complete(completeResponse);
            }

            @Override
            public void onError(Throwable error) {
                futureChatResponse.completeExceptionally(error);
            }
        });
        // 等待响应完成
        futureChatResponse.join();


    }
}
